//package com.j.lemon.learn.clickhouse;
//
//import com.alibaba.druid.pool.DruidDataSource;
//import com.opencsv.CSVReader;
//import org.apache.commons.lang3.RandomStringUtils;
//import org.springframework.util.CollectionUtils;
//
//import java.io.FileNotFoundException;
//import java.io.FileReader;
//import java.io.IOException;
//import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.SQLException;
//import java.time.Instant;
//import java.time.LocalDateTime;
//import java.time.ZoneOffset;
//import java.time.format.DateTimeFormatter;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.*;
//
///**
// * @author lijunjun
// */
//public class CkTest1 {
//    private static CountDownLatch countDownLatch = new CountDownLatch(10);
//
//    public static void main(String[] args) throws SQLException, FileNotFoundException {
//        final ExecutorService executorService = new ThreadPoolExecutor(8, 8, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(100000));
//        String driverClassName = "ru.yandex.clickhouse.ClickHouseDriver";
//        String url = "jdbc:clickhouse://10.28.149.247:38123/default";
//        String userName = "audit4a";
//        String password = "rryzggTR";
//        DruidDataSource dataSource = new DruidDataSource();
//        dataSource.setDriverClassName(driverClassName);
//        dataSource.setUrl(url);
//        dataSource.setUsername(userName);
//        dataSource.setPassword(password);
//        dataSource.setTestWhileIdle(true);
//        dataSource.setMaxActive(100);
//        dataSource.setMaxWait(60000);
//        dataSource.setTestOnBorrow(false);
//
//
//        Connection connection = dataSource.getConnection();
//        for (int i = 1; i < 60; i++) {
//            connection.setAutoCommit(false);
//            String sql = "insert into behavior_log values (\n" +
//                    "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,\n" +
//                    "?,?,?,?,?)";
//            PreparedStatement ps = connection.prepareStatement(sql);
//            String csvFile = "/Users/lijunjun/Desktop/learn/alibabaUserBehaviorDatasets/split1_behavior_log/behavior_log_test_" + i + ".csv";
//            CSVReader reader = null;
//            try {
//                reader = new CSVReader(new FileReader(csvFile));
//                String[] line;
//                List<String[]> data = new ArrayList<>();
//                int count = 0;
//                int taskCount = 10;
//                while ((line = reader.readNext()) != null) {
//                    count++;
//                    if (count <= 1) {
//                        continue;
//                    }
//                    if (data.size() == 10000) {
//                        long l1 = System.currentTimeMillis();
//                        List<String[]> aaa = new ArrayList<>(data);
//                        data.clear();
//////                        for (String[] datum : aaa) {
//////                            ps.setInt(1,Integer.parseInt(datum[0]));
//////                            ps.setString(2,datum[1]);
//////                            ps.setString(3,datum[2]);
//////                            ps.setString(4,datum[3]);
//////                            LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(datum[4])), ZoneOffset.of("+8"));
//////                            String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//////                            ps.setString(5,format);
//////                            addExtColumns(ps);
//////                            ps.addBatch();
//////                        }
//////                        System.out.println("prepare data cost :"+(System.currentTimeMillis()-l1));
//////                        long l = System.currentTimeMillis();
//////                        ps.executeBatch();
//////                        connection.commit();
//////                        System.out.println("10000 records batch inserted cost:"+ (System.currentTimeMillis() - l));
////                    }
//                        data.add(line);
//                        System.out.println(count);
//                    }
//                }
//
//            } catch (IOException) {
//                e.printStackTrace();
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }
//
//
//    }
//
//    private static void addExtColumns(PreparedStatement ps) throws SQLException {
//        for (int i = 0; i < 500; i++) {
//            ps.setString(i + 6, RandomStringUtils.randomAlphanumeric(10));
//        }
//    }
//
//    static class Task1 implements Runnable {
//        private final List<String[]> dataSet;
//        DruidDataSource dataSource;
//
//        public Task1(List<String[]> data, DruidDataSource dataSource) {
//            this.dataSet = data;
//            this.dataSource = dataSource;
//        }
//
//        @Override
//        public void run() {
//            Connection connection = null;
//            PreparedStatement ps = null;
//            try {
//                String threadName = Thread.currentThread().getName();
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程开始处理，开始获取连接");
//                connection = dataSource.getConnection();
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程获取到连接");
//                connection.setAutoCommit(false);
//                String sql = "insert into behavior_log values (\n" +
//                        "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,\n" +
//                        "?,?,?,?,?)";
//                ps = connection.prepareStatement(sql);
//                long l1 = System.currentTimeMillis();
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程开始准备数据，size:" + dataSet.size());
//                for (String[] datum : dataSet) {
//                    ps.setInt(1, Integer.parseInt(datum[0]));
//                    ps.setString(2, datum[1]);
//                    ps.setString(3, datum[2]);
//                    ps.setString(4, datum[3]);
//                    LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(datum[4])), ZoneOffset.of("+8"));
//                    String format = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//                    ps.setString(5, format);
//                    long l = System.currentTimeMillis();
//                    addExtColumns(ps);
//                    ps.addBatch();
//                    System.out.println(System.currentTimeMillis() + "-" + threadName + "添加额外字段，addBatch cost" + (System.currentTimeMillis() - l));
//                }
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程数据准备完成");
//                System.out.println("prepare data(" + dataSet.size() + ") cost :" + (System.currentTimeMillis() - l1));
//                long l = System.currentTimeMillis();
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程开始批量插入");
//                ps.executeBatch();
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程批量插入完成，开始提交");
//                connection.commit();
//                System.out.println(System.currentTimeMillis() + "-" + threadName + "线程提交完成");
//                System.out.println(dataSet.size() + " records batch inserted cost:" + (System.currentTimeMillis() - l));
//                dataSet.clear();
//            } catch (SQLException throwables) {
//                throwables.printStackTrace();
//            } finally {
//                countDownLatch.countDown();
//                System.out.println("任务结束，count -1 ：" + countDownLatch.getCount());
//                if (connection != null) {
//                    try {
//                        connection.close();
//                    } catch (SQLException throwables) {
//                        throwables.printStackTrace();
//                    }
//                }
//                if (ps != null) {
//                    try {
//                        ps.close();
//                    } catch (SQLException throwables) {
//                        throwables.printStackTrace();
//                    }
//                }
//            }
//        }
//    }
//}
